/*
 * @ : Copyright (c) 2021 Phytium Information Technology, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0.
 *
 * @Date: 2021-04-07 09:53:30
 * @LastEditTime: 2021-10-09 09:32:24
 * @Description:  This files is for error code functions
 *
 * @Modify History:
 *  Ver   Who        Date         Changes
 * ----- ------     --------    --------------------------------------
 */

#ifndef _FT_ERROR_CODE_H
#define _FT_ERROR_CODE_H

#include "ft_types.h"

typedef s32 ft_error_t;

#define FT_SUCCESS 0

/* 系统错误码模块定义 */
typedef enum
{
    ErrorModGeneral = 0,
    ErrModBsp,
    ErrModAssert,
    ErrModPort,
    StatusModBsp,
    ErrModMaxMask = 255,

} FtErrorCodeModuleMask;

/* BSP模块的错误子模块定义 */
typedef enum
{
    ErrBspGeneral = 0,
    ErrBspClk,
    ErrBspRtc,
    ErrBspTimer,
    ErrBspUart,
    ErrBspGpio,
    ErrBspSpi,
    ErrBspEth,
    ErrCan,
    ErrPcie,
    ErrBspQSpi,
    ErrBspI2c,
    ErrBspMmc,
    ErrBspWdt,
    
    ErrGdma,

    ErrBspModMaxMask = 255
} FtErrCodeBspMask;

#define FT_ERRCODE_SYS_MODULE_OFFSET (u32)24
#define FT_ERRCODE_SUB_MODULE_OFFSET (u32)16

#define FT_ERRCODE_SYS_MODULE_MASK ((u32)0xff << FT_ERRCODE_SYS_MODULE_OFFSET) /* bit 24 .. 31 */
#define FT_ERRCODE_SUB_MODULE_MASK ((u32)0xff << FT_ERRCODE_SUB_MODULE_OFFSET) /* bit 16 .. 23 */
#define FT_ERRCODE_TAIL_VALUE_MASK ((u32)0xffff)                               /* bit  1 .. 15 */

/* Offset error code */
#define FT_ERRCODE_OFFSET(code, offset, mask) \
    (((code) << (offset)) & (mask))

/* Assembly error code */
#define FT_MAKE_ERRCODE(sys_mode, sub_mode, tail)                                                   \
    ((FT_ERRCODE_OFFSET((u32)sys_mode, FT_ERRCODE_SYS_MODULE_OFFSET, FT_ERRCODE_SYS_MODULE_MASK)) | \
     (FT_ERRCODE_OFFSET((u32)sub_mode, FT_ERRCODE_SUB_MODULE_OFFSET, FT_ERRCODE_SUB_MODULE_MASK)) | \
     ((u32)tail & FT_ERRCODE_TAIL_VALUE_MASK))
#define FT_CODE_ERR FT_MAKE_ERRCODE

#define ERR_SUCCESS FT_MAKE_ERRCODE(ErrorModGeneral, ErrBspGeneral, 0) /* 成功 */
#define ERR_GENERAL FT_MAKE_ERRCODE(ErrorModGeneral, ErrBspGeneral, 1) /* 一般错误 */

#endif
